Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

缓存、代理与 CDN

复习

  • HTTP 请求与响应:响应含首部与正文
  • Cookie 与会话:请求可携带客户端的信息
  • DNS 查询与缓存:缓存能减少重复的代价

TL;DR

  • 缓存把常用内容放在离用户更近的地方
  • 代理代表客户端或服务器转发请求
  • CDN 把内容分发到各地节点,就近服务
  • 缓存必须处理“内容过期”的一致性问题

正文

  如果每次访问同一个网站,都要从地球另一端把内容重新取一遍,就太浪费了。有没有办法把常用的内容放得离用户更近一点?

  有,这就是缓存(cache)与CDN的思路。

缓存:就近取用

  Web 缓存可以出现在多个位置:

  • 浏览器缓存:你的电脑自己存一份
  • 代理缓存:网络中间的一台服务器替你存
  • 内容分发网络:在全国乃至全球各地布置节点

  一旦内容被缓存,下次再要,就近取出即可:延迟低了,服务器压力也小了。 一举两得,正是空间换时间的又一次应用。

代理:站在中间替你办事

  代理(proxy)是夹在客户端和服务器之间的中间人。它可以:

  • 代表客户端去取内容,并顺便缓存下来供他人复用
  • 代表服务器分发内容、做访问控制和负载分担

  “加一个中间层”,又出现了。它把原本点到点的通信,变成了一段段可以优化的接力。

CDN:把内容搬到离你最近的地方

  CDN(内容分发网络)是缓存思想的极致:把内容提前复制到遍布各地的边缘节点上。用户访问时,就近从最近的节点取,不必回源到主机房。

  这特别适合那些不常变、人人都要的内容:图片、视频、样式表、脚本。效果也非常直观——无论用户身在何处,体验都更接近“本地”。

缓存绕不开的难题

  缓存有个绕不开的麻烦:内容会变,缓存却还是旧的。

  解决办法是给缓存设置过期规则(比如 Cache-Control、TTL):在有效期内直接用,过期了再去源头确认。于是又有一次权衡:

  • 缓存久一点:命中率高、快,但内容更新可能不及时
  • 缓存短一点:更新及时,但命中率下降、回源变多

  这和 DNS 的 TTL 是同一个道理。缓存的核心从来不是“存不存”,而是“存多久、什么时候作废”。

思考题 1

  缓存为什么能同时减少延迟和服务器负载?

思考题 2

  CDN 把内容放到各地节点,主要解决的是什么问题?

小结

知识点

  • 缓存把常用内容放到更近的位置
  • 代理作为中间层转发与缓存
  • CDN 通过全国/全球节点就近服务
  • 缓存通过过期规则在新鲜度与效率间权衡

参考资料

  1. Wikipedia(zh):内容分发网络:把内容分发到各地的节点网络
  2. Wikipedia(zh):Web缓存:缓存网页资源以减少重复获取

思考题答案(仅供参考)

思考题 1

  因为内容一旦被缓存,用户可以直接从近处取得,不必长途回源,延迟因此降低;同时大量重复请求被缓存挡下,真正到达服务器的请求减少,负载自然下降。一次缓存,多重收益。

思考题 2

  主要解决“距离”带来的高延迟和带宽压力。把静态内容预先复制到各地的边缘节点,用户就近获取,无论身在何处体验都更好,同时主机房不必承担全部流量。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪